It appears that one can make reasonably portable XSLT extension functions by:
  1) Making the methods static where possible (e.g. XSLTC does not yet
     support non-static methods).  [Methods and classes must be public, of
     course.]
  2) Using the following argument types:
       XSLT TYpe        Java Type
       ---------        ---------
       Node-Set         org.w3c.dom.NodeList
       String           String
       Boolean          boolean or Boolean
       Number           double or Double
       Result Fragment  org.w3c.dom.DocumentFragment
       Non-XSLT Object  any compatible (assignable) Object type
     The last case is where an Object of another type is passed to XSLT via
     an input parameter or other extension function, in which case any
     compatible type will do.  These cases apply to extension function return
     values as well.
  3) Introduce the extension function via a namespace ala:
       <xsl:stylesheet .... xmlns:myExtensionPrefix="fullclassname">
     and use it ala
       <xsl:variable name="foo" select="myExtensionsPrefix:methodName( ... )"/>
     For instance,
       <xsl:stylesheet .... xmlns:system="java.lang.System">
       ...
       <xsl:variable name="foo" select="system:currentTimeMillis()"/>

These simple techniques appear to work with Xalan 2 and SAXON and in the
absence of an actual standard would appear worth adherring to where possible.